package com.example.mq.common;

import java.io.*;

/**
 * 这个工具类用可以
 * 将对象序列化为字节数组
 * 将字节数组反序列化为对象
 * 任何实现了 Serializable 接口的类都能使用
 */
public class BinaryTool {
    /**
     * 将 一个对象 序列化为 一个字节数组
     * @param object    对象
     * @return          字节数组
     */
    public static byte[] toBytes(Object object) throws IOException {
        // 由于不能确定 byte[] 的大小所以使用 ByteArrayOutputStream
        // 这个流对象相当于一个变长的字节数组，将序列化后的内容，先写入 ByteArrayOutputStream
        // 最终将 ByteArrayOutputStream 转为字节数组 return
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // ObjectOutputStream 的 writeObject 可以将对象序列化
                // 写入 ObjectOutputStream 中，ObjectOutputStream 再写入 ByteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            return byteArrayOutputStream.toByteArray();
        }
    }

    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
